// 父类
class People{
	constructor(name){
		this.name=name
	}
	eat(){
		console.log(`${this.name} eat something`)
	}
}
// 子类
class Student extends People{
	constructor(name,number){
		super(name);
		this.number=number
	}
	sayHi(){
		console.log(`姓名:${this.name},学号${this.number}`)
	}
}
// 子类
class Teacher extends People{
	constructor(name,marjor){
		super(name)
		this.marjor=marjor
	}
	teach(){
		console.log(`${this.name} 教授 ${this.marjor}`)
	}
}
const dd=new Student('东东',100);

const Wanglaoshi=new Teacher('王老师','语文')

dd.sayHi();
Wanglaoshi.teach();




// 类型判断 - instanceof
// instanceof 可以判断是否是引用类型 是否是后面class构建出来或者class是他的父类

console.log(dd instanceof Student);  //true  这个实例Student不继承于object而是先继承的people
console.log(dd instanceof People);	 //true
console.log(dd instanceof Object); //true,object可以认为是任何一个class的父类
console.log(Wanglaoshi instanceof Student) //false
//[] instanceof Array  true
//[] instanceof Object true
//{} instanceof Object true

//class实际上是函数，可见是语法糖
console.log(typeof People) // 'function'
console.log(typeof Student) // 'funciton'

// 隐式原型：
console.log(dd.__proto__)
// 显示原型：
console.log(Student.prototype)
// 引用通同一个内存地址:
console.log(dd.__proto__ === Student.prototype);




// 总结：
// 1.每个class都有显示原型prototype
// 2.每个实例都有隐式原型__proto__
// 3.实例的__proto__指向对应class的prototype


// 基于原型的执行规则

// 获取属性dd.name或者执行方法dd.sayHi()时，
// 1.现在自身属性和方法中寻找
// 2.找不到就自动去隐式原型(__proto__)上查找